home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 1
/
SPACE - Library 1 - Volume 1.iso
/
program
/
168
/
as.doc
next >
Wrap
Text File
|
1988-04-17
|
6KB
|
163 lines
The assembler, AS.TTP, takes as input all files listed on the command
line. Output is placed in YA.OUT, unless over-ridden by the -o option.
All files after the -l in the command line are treated as libraries; only
unresolved symbols will be added to the load module. The options to the
assembler include:
-o outfile output placed in outfile
-m a symbol table map is included in the output
-l lib ... all files that follow are libraries
-f listfile input file names are found in listfile
(this gets around the 128 byte command line limit)
The input is always MJC intermediate code, which is a terse form of
assembly language. This saves space, makes the assembler/loader quicker,
and allows one to create "object" modules with a regular text editor.
The drawback is that it takes more space than typical object code.
Basically, every line maps into one or more 68000 instructions.
I have listed here all the codes, their 68000 assembler equivalent,
and a brief comment. Some notes at the end explain labels,
strings, and operations (e.g. add, sub, etc).
! comment, everything on the line is ignored
: sym define a text symbol
. sym val define a bss symbol; val is number of bytes needed
* lbl define a label (see notes)
$ str define a string (see notes)
= num word value in text space
=. sym address value in text space
=$ str string address in text space
=+ sym val address of symbol + value in text space
? sym remove the symbol from symbol table (for static)
csv link A6,#stk set frame and stack pointer
ret unlk A6;rts return from function
efn stk end of function, stk becomes
the constant for csv
rsv reglst movem reglist,-(A7) push active registers
rst regpat movem (A7)+,reglist pop active registers
rs[wl] x off move.[wl] Ax,off(A6) save register variable
rr[wl] off x move.[wl] off(A6),Ax restore register variable
cse num lbl cmpi.l #num,D0 compare for case statements
brc op lbl bcc lbl branch on condition (see notes)
jmp lbl bra lbl unconditional branch
jsr sym jsr sym direct function call
jsi x jsr (Ax) indirect function call
trp num trap #num trap instruction
pop num adda.l #num,A7 pop stuff off the stack
pd[wl] num move.[wl] #num,-(A7) push a value on the stack
pl[bwl] off move.[bwl] off(A6),-(A7)push a local variable
pha x move.l Ax,-(A7) push an address on stack
tad x y move.l Ax,Dy transfer Areg to Dreg
tda x y move.l Dx,Ay transfer Dreg to Areg
tdd x y move.l Dx,Dy transfer Dreg to Dreg
ld[wl] num d move.[wl] #num,Dd load value
ll[bwl] off d move.[bwl] off(A6),Dd load local variable
lg[bwl] sym d move.[bwl] sym,Dd load global variable
lx[bwl] a i d move.[bwl] 0(Aa,Di),Dd load indexed value
lo[bwl] a off d move.[bwl] off(Aa),Dd load indirect with offset
l$ str a lea #str,Aa load string address
lag sym a lea sym,Aa load global address
lal off a lea off(A6),Aa load local address
lax a i x lea 0(Aa,Di),Ax load indexed address
lao a off x lea off(Aa),Ax load address of indirect offset
ob[bwl] op x y xxx.[bwl] Dx,Dy binary operation (see notes)
ou[bwl] op x xxx.[bwl] Dx unary operation (see notes)
so[bwl] a off d move.[bwl] Dd,off(Aa) store indirect with offset
sg[bwl] d sym move.[bwl] Dd,sym store global
sl[bwl] d off move.[bwl] Dd,off(A6) store local
sx[bwl] a i d move.[bwl] Dd,0(Aa,Di) store indexed value
ad[bwl] num d various opcodes multiply Dd by num, long result
cm[bwl] x y cmp.[bwl] Dx,Dy compare two values
cd[bwl] x num cmpi.[bwl] #num,Dx immediate data compare
ts[bwl] x tst.[bwl] Dx test register against 0
ig[bwl] num sym addi.[bwl] #num,sym increment global
il[bwl] num off addi.[bwl] #num,off(A6) increment local
irl num x addi.l #num,Ax increment register var
ii[bwl] num a addi.[bwl] #num,(Aa) increment indirect
xtb x ext.w Dx extend byte to word
xtw x ext.l Dx extend word to long
xub x andi.l #0xFF,Dx unsigned extend byte to long
xuw x andi.l #0xFFFF,Dx unsigned extend word to long
Notes:
Labels and string identifiers are numbers that are re-used for every function.
As labels and strings are used, the assembler keeps track of their use.
When the "efn" opcode is encountered, all the label forward references
are fixed up and the label identifiers can then be re-used. Strings are
typically a forward reference, which is fixed up when the string is defined.
All the possible C operations are numbered by the compiler. These numbers
are matched in the assembler to 68000 opcodes.
1 or
2 exclusive or
3 and
4 equal (comparison)
5 not equal (comparison)
6 less than (comparison)
7 greater than (comparison)
8 less than or equal (comparison)
9 greater than or equal (comparison)
10 shift left
11 logical shift right
12 add
13 subtract
14 multiply
15 divide
16 mod
17 logical negation
18 arithmetic negation
19 bitwise negation (eor #0xFFFFFFFF,reg)
20 unsigned equal (comparison)
21 unsigned not equal (comparison)
22 unsigned low (comparison)
23 unsigned high (comparison)
24 unsigned low or same (comparison)
25 unsigned high or same (comparison)
26 arithmetic shift right (sign bit carried through)
If your favorite 68000 opcode does not appear in the above, you can resort
to using the "=" facility to place opcodes in line in the text. For example,
you can get access to the LineA facilities with:
PutPixel(color, x, y) {
/* set up input LineA variables */
asm( = 40961 ); /* 40961 == 0xA001 */
}
Arguments to opcodes can be set using =. or =$ codes. For example,
"move.l xxx,yyy"
can be implemented in an intermediate code module as
= 9209 # opcode for move.l sym.l,sym.l
=. xxx # address of symbol xxx
=. yyy # address of symbol yyy
Please remember that all values in the intermediate code are
(long signed) decimal. That certainly doesn't make the above easy,
but you should be writing in C most the time anyway, right?
I have recently build a filter that takes Motorola assembly format
and generates the stuff above. Send me a letter if you're interested.